/* 
    NodeJS的事件轮询
        - JS是单线程的， nodejs是做到非阻塞是因为在nodejs内部使用了第三方库libuv，nodejs会把IO，文件读取等异步操作交由他处理，而nodejs主线程可以继续去处理其他的事情。
        - libuv会开启不同的线程去处理这些延时操作，处理完后，会把异步操作的回调函数放到nodejs的轮询队列中，nodejs会在适当的时候处理轮询队列中的回调函数，从而实现非阻塞。
        - node的事件轮询分为六个阶段，每个阶段都有一个 FIFO（先进先出） 队列来执行回调，事件轮询会依次进入每一个回调队列，当该队列已用尽或达到回调限制，事件循环将移动到下一阶段。
        - 六个阶段
            1. timers：用来处理setTimeout() 和 setInterval() 的回调函数
            2. pending callbacks阶段:这个阶段用来处理系统操作的回调函数（可以忽略）
            3. idle prepare阶段:此阶段是仅供nodejs内部操作调用，忽略
            4. poll阶段:这个阶段主要用来处理如IO操作，网络请求等异步操作
                - 当poll阶段的回调函数队列不为空的时候，则处理队列中的回调函数，直到队列为空或者达到上限的时候，就跳过此阶段，处理下一阶段。
                - 当poll阶段的回调函数队列为空的时候,系统会在此阶段等待新的回调函数入队，再进行处理，但是如果timers阶段有回调函数需要执行，或者check阶段有setImmediate需要执行，则会立马进入下一个阶段
            5. check阶段：这个阶段用来处理setImmediate的回调函数
            6. close callbacks阶段：这个阶段用来处理如socket的close事件



*/